package com.gs.view.impostazioni;

import java.util.Observable;
import java.util.Vector;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.gs.Controllore;
import com.gs.R;
import com.gs.business.IAggiornatoreModel;
import com.gs.business.cache.CacheCategorie;
import com.gs.business.cache.CacheGruppi;
import com.gs.business.comadi.categorie.CommandInserisciCategoria;
import com.gs.business.comadi.categorie.CommandUpdateCategoria;
import com.gs.business.comadi.gruppi.CommandDeleteGruppo;
import com.gs.domain.CatSpese;
import com.gs.domain.Gruppi;
import com.gs.domain.wrapper.WrapCatSpese;
import com.gs.view.riepilogo.ListaCategorie;
import comi.gsi.command.CommandManager;

public class CategorieView extends AbstractCategorieView implements IAggiornatoreModel {

	private final EditText nome = null;
	private final EditText descrizione = null;
	private final Spinner gruppi = null;
	private final Spinner importanza = null;
	private final Button inserisciOaggiorna = null;
	private final Button viewOrCanc = null;
	private ArrayAdapter<Gruppi> arrayAdapterGruppi = null;
	private ArrayAdapter<String> arrayAdapterImportanza = null;

	@Override
	protected int getIdLayout() {
		return R.layout.categorie;
	}

	@Override
	protected void myOnCreate(final Bundle savedInstanceState) {

		Intent i = getIntent();
		int prova = i.getIntExtra("idCategoria", 0);

		initForSpecificUse(prova);

		getListaGruppi().setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

			@Override
			public void onItemSelected(final AdapterView<?> adapterView, final View view, final int arg2, final long arg3) {

				final TextView textView = ((TextView) view);
				if (textView.getText().equals("new...")) {
					//					onCreateDialog(0);
					//					showDialog(0);
					final Intent i = new Intent(view.getContext(), GruppiView.class);
					startActivity(i);
				}
			}

			@Override
			public void onNothingSelected(final AdapterView<?> arg0) {
			}
		});

		getInserisciOaggiorna().setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(final View v) {
				final CatSpese clonata = ((CatSpese) getModelCatSpese().getEntitaPadre()).clona();
				aggiornaModelDaVista();
				if (getInserisciOaggiorna().getText().equals("Inserisci")) {
					if (Controllore.invocaComando(new CommandInserisciCategoria(getModelCatSpese()))) {
						Toast.makeText(CategorieView.this, "Categoria inserita correttamente", Toast.LENGTH_SHORT).show();
					}
				} else if (getInserisciOaggiorna().getText().equals("Aggiorna")) {
					if (Controllore.invocaComando(new CommandUpdateCategoria(clonata, (CatSpese) getModelCatSpese().getEntitaPadre()))) {
						Toast.makeText(CategorieView.this, "Categoria aggiornata correttamente", Toast.LENGTH_SHORT).show();
					}
				}
			}
		});

		getViewOrCanc().setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(final View v) {
				if (getViewOrCanc().getText().equals("Visualizza")) {
					final Intent i = new Intent(v.getContext(), ListaCategorie.class);
					v.getContext().startActivity(i);
				} else if (getViewOrCanc().getText().equals("Elimina")) {
					aggiornaModelDaVista();
					CommandDeleteGruppo cancGruppo = new CommandDeleteGruppo((Gruppi) getModelCatSpese().getEntitaPadre());
					if (CommandManager.getIstance().invocaComando(cancGruppo)) {
						Toast.makeText(CategorieView.this, "Categoria eliminata correttamente", Toast.LENGTH_SHORT).show();
					}
				}
			}
		});
	}

	@Override
	protected Dialog onCreateDialog(final int id) {
		Dialog dialogo = null;
		AlertDialog.Builder builder = new AlertDialog.Builder(this);

		//		LayoutInflater inflater = getLayoutInflater();
		//		FrameLayout f1 = (FrameLayout) this.findViewById(android.R.id.content);
		//		f1.addView(inflater.inflate(R.layout.gruppi, f1, false));
		//		builder.setView(f1);
		builder.setPositiveButton("Inserisci", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(final DialogInterface dialog, final int arg1) {
				dialog.dismiss();
			}
		});
		builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(final DialogInterface dialog, final int which) {
				dialog.dismiss();

			}
		});
		dialogo = builder.create();
		return dialogo;

	}

	public Gruppi[] getArrayGruppi() {
		final Vector<Gruppi> gruppiCombo = CacheGruppi.getSingleton().getVettoreGruppiPerCombo();
		final Gruppi gruppo = new Gruppi();
		gruppo.setnome("new...");
		gruppiCombo.add(gruppo);
		final Gruppi[] groups = gruppiCombo.toArray(new Gruppi[gruppiCombo.size()]);
		return groups;
	}

	public void initForSpecificUse(final int prova) {
		final Gruppi[] gruppi = getArrayGruppi();
		arrayAdapterGruppi = new ArrayAdapter<Gruppi>(this, android.R.layout.simple_spinner_item, gruppi);
		getListaGruppi().setAdapter(arrayAdapterGruppi);

		final String[] tipiImportanza = new String[] { "Futile", "Variabile", "Fisso" };
		arrayAdapterImportanza = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, tipiImportanza);
		getListaImportanza().setAdapter(arrayAdapterImportanza);

		if (prova != 0) {
			CatSpese gruppo = CacheCategorie.getSingleton().getCatSpese(Integer.toString(prova));
			this.setModelCatSpese(new WrapCatSpese(gruppo));
			update(this.modelCatSpese, null);
			getInserisciOaggiorna().setText("Aggiorna");
			getViewOrCanc().setText("Elimina");
		} else {
			getInserisciOaggiorna().setText("Inserisci");
			setModelCatSpese(new WrapCatSpese());
		}
	}

	@Override
	public void update(final Observable arg0, final Object arg1) {

		if (getNome() != null & modelCatSpese.getNomeEntita() != null) {
			getNome().setText(modelCatSpese.getNomeEntita());
		}
		if (getDescrizione() != null & modelCatSpese.getdescrizione() != null) {
			getDescrizione().setText(modelCatSpese.getdescrizione());
		}

		if (getListaGruppi() != null & modelCatSpese.getGruppi() != null) {
			getListaGruppi().setSelection(arrayAdapterGruppi.getPosition(modelCatSpese.getGruppi()));
		}

		if (getListaImportanza() != null & modelCatSpese.getimportanza() != null) {
			getListaImportanza().setSelection(arrayAdapterImportanza.getPosition(modelCatSpese.getimportanza()));
		}
	}

	@Override
	public void aggiornaModelDaVista() {
		//TODO questa gestione degli id è quantomeno approssimativa
		//		final int idCategoria = (CacheCategorie.getSingleton().getMaxId()) + 1;
		//		getModelCatSpese().setidCategoria(idCategoria);

		setcNome(getNome().getText().toString());

		setcDescrizione(getDescrizione().getText().toString());

		setGruppo((Gruppi) getListaGruppi().getSelectedItem());

		setcImportanza((String) getListaImportanza().getSelectedItem());

	}

	public boolean nonEsistonoCampiNonValorizzati() {
		return getNome().getText() != null && getDescrizione().getText() != null && getListaImportanza().getSelectedItem() != null && getListaGruppi().getSelectedItem() != null;
	}

	public EditText getNome() {
		return (EditText) lazyLoad(nome, R.id.editCategoriaNome);
	}

	public EditText getDescrizione() {
		return (EditText) lazyLoad(descrizione, R.id.editCategoriaDescrizione);
	}

	public Spinner getListaImportanza() {
		return (Spinner) lazyLoad(importanza, R.id.spinnerCategoriaImportanza);
	}

	public Spinner getListaGruppi() {
		return (Spinner) lazyLoad(gruppi, R.id.spinnerCategoriaGruppo);
	}

	public Button getInserisciOaggiorna() {
		return (Button) lazyLoad(inserisciOaggiorna, R.id.btnCategoriaInserisci);
	}

	public Button getViewOrCanc() {
		return (Button) lazyLoad(viewOrCanc, R.id.btnCategoriaVisualizza);
	}

}
